package com.woniuxy.mapper;

import com.woniuxy.entity.*;
import com.woniuxy.entity.DTO.FlashSaleProductDTO;
import com.woniuxy.entity.DTO.FlashSalesDTO;
import com.woniuxy.entity.DTO.QueryTimeSaleGoodsDTO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
* @author PC
* @description 针对表【flash_sales(活动信息表)】的数据库操作Mapper
* @createDate 2025-05-12 17:04:23
* @Entity com.woniuxy.entity.FlashSales
*/
public interface FlashSalesMapper {
    /**
     * <p>查询所有活动状态。</p>
     * @return 活动状态列表
     */
    List<TimeSaleStatus> selectTimeSaleStatusList();

    /**
     * <p>查询所有限时抢购活动信息。</p>
     * @return 限时抢购活动信息列表
     */
    List<FlashSalesDTO> selectAllTimeSale();

    /**
     * <p>根据条件查询限时抢购活动信息。</p>
     * @param param 查询条件
     * @return 限时抢购活动信息列表
     */
    List<FlashSalesDTO> selectTimeSaleByCondition(FlashSalesDTO param);

    /**
     * <p>添加活动基本信息</p>
     *
     * @param flashSales 活动基本信息
     * @return 自增活动 ID
     */
    Integer insertTimeSale(FlashSales flashSales);

    /**
     * <p>批量插入活动商品信息。</p>
     *
     * @param flashSaleProductsList 活动商品信息列表
     */
    void insertBatchTimeSale(List<FlashSaleProducts> flashSaleProductsList);

    /**
     * <p>更新数据库商品表信息，减去活动库存。</p>
     * @param flashSaleProductsList 活动商品信息列表
     */
    void updateBatchMinusStock(List<FlashSaleProducts> flashSaleProductsList);

    /**
     * <p>查询所有“已上架”状态，且库存不为 0 的商品。</p>
     *
     * @param name 商品名称，允许为空，为空时查询所有商品
     * @return 商品列表
     */
    List<Goods> selectAllAvailableGoods(String name);

    /**
     * <p>根据活动 ID 查询活动基本信息。</p>
     * @param saleId 活动 ID
     * @return 活动基本信息
     */
    FlashSalesDTO selectTimeSaleBySaleId(Integer saleId);

    /**
     * <p>根据活动 ID 查询活动商品信息。</p>
     * @param saleId 活动 ID
     * @return 活动商品列表
     */
    List<FlashSaleProductDTO> selectTimeSaleProductsBySaleId(Integer saleId);

    /**
     * <p>修改活动基本信息。</p>
     * @param flashSales 活动基本信息
     */
    void updateTimeSale(FlashSales flashSales);

    /**
     * <p>编辑活动信息，释放库存。</p>
     * @param flashSaleProductsList 活动商品信息
     */
    void updateBatchPlusStock(List<FlashSaleProducts> flashSaleProductsList);

    /**
     * <p>清空活动商品列表。</p>
     * @param saleId 活动 ID
     */
    void deleteBatchSaleProductsBySaleId(Integer saleId);

    /**
     * <p>取消活动。</p>
     * @param flashSales 活动信息
     */
    void updateCancelTimeSale(FlashSales flashSales);

    /**
     * <p>查询未来 1 小时内的所有“未开始”状态的活动。</p>
     * @param now 当前系统时间
     * @param oneHourLater 1 小时后的时间
     * @return 活动列表
     */
    List<FlashSalesDTO> findByStartTimeBetween(@Param("now") LocalDateTime now,
                                               @Param("oneHourLater") LocalDateTime oneHourLater);

    /**
     * <p>根据商品名称模糊查询活动商品。</p>
     *
     * @param userId 用户 ID
     * @param searchKey 商品名称
     * @return 活动商品列表
     */
    List<QueryTimeSaleGoodsDTO> selectTimeSaleGoodsByGoodsName(@Param("userId") Integer userId,
                                                               @Param("searchKey") String searchKey);

    /**
     * <p>商品第一次添加到购物车。</p>
     *
     * @param queryTimeSaleGoodsDTOList
     */
    void insertShoppingCart(List<QueryTimeSaleGoodsDTO> queryTimeSaleGoodsDTOList);

    /**
     * <p>如果商品不是第一次添加购物车，则更改购物车信息。</p>
     *
     * @param queryTimeSaleGoodsDTOList
     */
    void updateShoppingCart(List<QueryTimeSaleGoodsDTO> queryTimeSaleGoodsDTOList);
}
